package com.ruoyi.smart.controller;

import java.util.*;
import javax.servlet.http.HttpServletResponse;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.smart.domain.SmartProduct;
import com.ruoyi.smart.service.ISmartProductService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;

/**
 * 产品Controller
 * 
 * @author minwei
 * @date 2022-04-19
 */
@Api("产品表")
@RestController
@RequestMapping("/smart/product")
public class SmartProductController extends BaseController
{
    @Autowired
    private ISmartProductService smartProductService;

    /**
     * 查询产品列表
     */
    //@ApiOperation("查询产品列表（系统生成）")
    @PreAuthorize("@ss.hasPermi('smart:product:list')")
    @GetMapping("/list")
    public TableDataInfo list(SmartProduct smartProduct)
    {
        startPage();
        List<SmartProduct> list = smartProductService.selectSmartProductList(smartProduct);
        return getDataTable(list);
    }

    /**
     * 查询产品列表
     */
    @ApiOperation("查询产品列表")
    @PreAuthorize("@ss.hasPermi('smart:product:list')")
    @GetMapping("/listWI")
    public TableDataInfo listWI(SmartProduct smartProduct)
    {
        startPage();
        List<SmartProduct> list = smartProductService.selectSmartProductList(smartProduct);
        return getDataTable(list);
    }

    /**
     * 查询产品列表
     */
    @ApiOperation("查询产品列表")
    @PreAuthorize("@ss.hasPermi('smart:product:list')")
    @GetMapping("/listFT")
    public TableDataInfo listFT(SmartProduct smartProduct)
    {
        startPage();
        List<SmartProduct> list = smartProductService.selectSmartProductList(smartProduct);
        return getDataTable(list);
    }

    /**
     * 查询产品列表
     */
    @ApiOperation("查询产品列表")
    @PreAuthorize("@ss.hasPermi('smart:product:list')")
    @GetMapping("/listHT")
    public TableDataInfo listHT(SmartProduct smartProduct)
    {
        startPage();
        List<SmartProduct> list = smartProductService.selectSmartProductList(smartProduct);
        return getDataTable(list);
    }

    /**
     * 导出产品列表
     */
    @PreAuthorize("@ss.hasPermi('smart:product:export')")
    @Log(title = "产品", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, SmartProduct smartProduct)
    {
        List<SmartProduct> list = smartProductService.selectSmartProductList(smartProduct);
        ExcelUtil<SmartProduct> util = new ExcelUtil<SmartProduct>(SmartProduct.class);
        util.exportExcel(response, list, "产品数据");
    }

    /**
     * 获取产品详细信息
     */
    //@ApiOperation("获取产品详细信息（系统生成）")
    @PreAuthorize("@ss.hasPermi('smart:product:query')")
    @GetMapping(value = "/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id)
    {
        return AjaxResult.success(smartProductService.selectSmartProductById(id));
    }

    /**
     * 参数分别是：
     * 1.组织机构[organization]（参数：0，无机构，1，所有机构，2有计划单的机构）
     * 2.产品计划[plan]（参数：0，无计划，1，所有计划 ，2有产品的计划）
     * 3.产品型号[productModel]（参数：0，无型号，1，所有型号 ，2有计划的型号）
     *
     * @return 产品集合
     */
    @ApiOperation("查询产品列表")
    @GetMapping("/listAll")
    public TableDataInfo selectSmartProductList(SelectParam selectParam){
        startPage();
        List<SmartProduct> list = smartProductService.selectSmartProductList(selectParam.getOrganization(),selectParam.getPlan(),selectParam.getProductModel(),new SmartProduct());
        return getDataTable(list);
    }

    /**
     * 参数分别是：
     * 1.组织机构[organization]（参数：0，无机构，1，所有机构，2有计划单的机构）
     * 2.产品计划[plan]（参数：0，无计划，1，所有计划 ，2有产品的计划）
     * 3.产品型号[productModel]（参数：0，无型号，1，所有型号 ，2有计划的型号）
     *
     * @return 产品集合
     */
    //添加查询参数
    @ApiOperation("查询合格产品和不合格产品数据量 //      * 参数分别是：\n" +
            "//      * 1.组织机构[organization]（参数：0或者空，所有机构，其他：组织机构id）\n" +
            "//      * 2.产品计划[plan]（参数：0或者空，所有计划，其他：计划ID）\n" +
            "//      * 3.产品型号[productModel]（参数：0或者空，所有型号，其他：产品型号ID）")
    @GetMapping("/productQualityNum")
    public AjaxResult productQualityNum(SelectParam selectParam){
        SmartProduct smartProduct=new SmartProduct();
        smartProduct.setTastState("2");  //查询合格数量
        List<SmartProduct> listqulity = smartProductService.selectSmartProductList(selectParam.getOrganization(),selectParam.getPlan(),selectParam.getProductModel(),smartProduct);
        smartProduct.setTastState("3");  //查询不合格数量
        List<SmartProduct> listunqulity = smartProductService.selectSmartProductList(selectParam.getOrganization(),selectParam.getPlan(),selectParam.getProductModel(),smartProduct);
        smartProduct.setTastState("1");  //查询未完成数量
        List<SmartProduct> listunfinish = smartProductService.selectSmartProductList(selectParam.getOrganization(),selectParam.getPlan(),selectParam.getProductModel(),smartProduct);
        ProductTsetCount productTsetCount=new ProductTsetCount();
        productTsetCount.setQuality(listqulity.size());
        productTsetCount.setUnquality(listunqulity.size());
        productTsetCount.setUnfinish(listunfinish.size());
        return AjaxResult.success(productTsetCount);
    }

    /**
     * 参数分别是：
     * 1.组织机构[organization]（参数：0，无机构，1，所有机构，2有计划单的机构）
     * 2.产品计划[plan]（参数：0，无计划，1，所有计划 ，2有产品的计划）
     * 3.产品型号[productModel]（参数：0，无型号，1，所有型号 ，2有计划的型号）
     *
     * @return 产品集合
     */
    //添加查询参数
    @ApiOperation("查询这周合格产品和不合格产品数据量     //      * 参数分别是：" +
            "//      * 1.组织机构[organization]（参数：0或者空，所有机构，其他：组织机构id）" +
            "//      * 2.产品计划[plan]（参数：0或者空，所有计划，其他：计划ID）" +
            "//      * 3.产品型号[productModel]（参数：0或者空，所有型号，其他：产品型号ID）" +
            "//      * 4.前推几周[previous]（参数：正整数 ")
    @GetMapping("/productQualityNumWeek")
    public AjaxResult productQualityNumWeek(SelectParam selectParam){
        SmartProduct smartProduct=new SmartProduct();

        Date date = new Date();
        Calendar calendar = Calendar.getInstance();//new一个Calendar类,把Date放进去
        calendar.setTime(date);
        //selectParam.setPrevious(1);
        if(selectParam.getPrevious()!=null){
            calendar.add(Calendar.DATE,0-(selectParam.getPrevious()*7));
        }
        //查询当前是星期几
        String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
//        int w = calendar.get(Calendar.DAY_OF_WEEK) - 1;
//        if (w < 0)
//            w = 7;
        int w = 7;
        Map<String,ProductTsetCount> map=new LinkedHashMap<>();
        calendar.add(Calendar.DATE, 0-w);
        for(int i=1;i<=w;i++){
            // 获取当前日
            int day = calendar.get(Calendar.DATE);
            // 获取当前月
            int month = calendar.get(Calendar.MONTH) + 1;
            //设置时间为0点
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            //calendar.add(Calendar.DATE, i-w);
            smartProduct.setStartDay(calendar.getTime());
            calendar.add(Calendar.DATE, 1);
            smartProduct.setEndDay(calendar.getTime());
            ProductTsetCount productTsetCount=new ProductTsetCount();
            smartProduct.setTastState("2");  //查询合格数量
            List<SmartProduct> listqulity = smartProductService.selectSmartProductList(selectParam.getOrganization(),selectParam.getPlan(),selectParam.getProductModel(),smartProduct);
            productTsetCount.setQuality(listqulity.size());
            smartProduct.setTastState("3");  //查询不合格数量
            List<SmartProduct> listunqulity = smartProductService.selectSmartProductList(selectParam.getOrganization(),selectParam.getPlan(),selectParam.getProductModel(),smartProduct);
            productTsetCount.setUnquality(listunqulity.size());


//            if(i == 7) map.put(weekDays[0],productTsetCount);
//            else map.put(weekDays[i],productTsetCount);
            map.put(String.valueOf(month)+"/"+String.valueOf(day),productTsetCount);
        }
        return AjaxResult.success(map);
    }


    /**
     * 新增产品
     */
    //@ApiOperation("新增产品")
    @PreAuthorize("@ss.hasPermi('smart:product:add')")
    @Log(title = "产品", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody SmartProduct smartProduct)
    {
        return toAjax(smartProductService.insertSmartProduct(smartProduct));
    }

    /**
     * 修改产品
     */
    //@ApiOperation("修改产品")
    @PreAuthorize("@ss.hasPermi('smart:product:edit')")
    @Log(title = "产品", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody SmartProduct smartProduct)
    {
        return toAjax(smartProductService.updateSmartProduct(smartProduct));
    }

    /**
     *  获取质检数据
     */
    @ApiOperation("获取质检数据")
    @GetMapping("/productQualityChart/{id}")
    public AjaxResult quality(@PathVariable("id") Long id)
    {
        return AjaxResult.success(smartProductService.quality(id));
    }

    /**
     * 删除产品
     */
    //@ApiOperation("删除产品")
    @PreAuthorize("@ss.hasPermi('smart:product:remove')")
    @Log(title = "产品", businessType = BusinessType.DELETE)
	@DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable Long[] ids)
    {
        for(Long id :ids)
        {
            if(id==7) return AjaxResult.error("默认产品不允许删除");
        }
        return toAjax(smartProductService.deleteSmartProductByIds(ids));
    }

    class SelectParam{
        String organization;
        String plan;
        String productModel;
        Integer previous;

        public String getOrganization() {
            return organization;
        }

        public void setOrganization(String organization) {
            this.organization = organization;
        }

        public String getPlan() {
            return plan;
        }

        public void setPlan(String plan) {
            this.plan = plan;
        }

        public String getProductModel() {
            return productModel;
        }

        public void setProductModel(String productModel) {
            this.productModel = productModel;
        }

        public Integer getPrevious() { return previous; }

        public void setPrevious(Integer previous) { this.previous = previous; }
    }

    class ProductTsetCount{
       int quality;
       int unquality;
       int unfinish;
        public int getQuality() {
            return quality;
        }

        public void setQuality(int quality) {
            this.quality = quality;
        }

        public int getUnquality() {
            return unquality;
        }

        public void setUnquality(int unquality) {
            this.unquality = unquality;
        }

        public int getUnfinish() {
            return unfinish;
        }

        public void setUnfinish(int unfinish) {
            this.unfinish = unfinish;
        }
    }
}
